﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//柔性数组

struct S1
{
	int n;
	char c;
	//柔性数组成员
	int arr[];//或int arr[0]
};

//VS也支持这种写法
//struct S2
//{
//	int n;
//	char c;
//	//柔性数组成员
//	int arr[0];
//};

//错误写法
//struct S3
//{
//	//柔性数组前必须有成员
//	int arr[];
//};

int main()
{
	printf("%d\n", sizeof(struct S1));//结构体大小不包含柔性数组

	//malloc一块空间
	struct S1* ps = (struct S*)malloc(sizeof(struct S1) + 10 * sizeof(int));
	//前面的sizeof(struct S1)是给n和c开辟空间，后面的10*sizeof(int)是给柔性数组开辟的空间
	if (ps == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//使用
	ps->c = 'a';
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = i + 1;
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
	//调整arr数组的大小
	struct S* tmp = (struct S1*)realloc(ps, sizeof(struct S1) + 20 * sizeof(int));
	if (tmp == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	ps = tmp;
	//使用
	for (i = 10; i < 20; i++)
	{
		ps->arr[i] = i + 1;
	}
	for (i = 0; i < 20; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\0");
	//释放
	free(ps);
	ps = NULL;

	return 0;
}


